#include <iostream>
#include <memory>

#include "absl/flags/flag.h"
#include "absl/flags/parse.h"

#include <grpcpp/grpcpp.h>

#include "calc.ptoto.grpc.pb.h"  // 包含通过 Protocol Buffers 编译生成的 gRPC 服务定义

ABSL_FLAG(std::string, target, "localhost:50051", "Server address");

using namespace std;

class CalcClient {
public:
    CalcClient(shared_ptr<grpc::Channel> channel)
      : _stub(calc::Calc::NewStub(channel)) {}  // 通过通道创建 Stub

    // 执行加法操作
    int Add(int a, int b) {
        // 创建请求
        calc::AddRequest request;
        request.set_a(a);
        request.set_b(b);

        // 创建响应容器
        calc::AddReply reply;

        // 创建客户端上下文
        grpc::ClientContext context;

        // 实际执行 RPC 调用
        grpc::Status status = _stub->Add(&context, request, &reply);

        // 根据调用状态进行处理
        if (status.ok()) {
            return reply.sum();  // 返回相加的结果
        } else {
            cout << status.error_code() << ": " << status.error_message() << endl;  // 打印错误信息
            return 0;
        }
    }

private:
    unique_ptr<calc::Calc::Stub> _stub;  // gRPC Stub
};

int main(int argc, char** argv) {
    absl::ParseCommandLine(argc, argv);  // 解析命令行参数
    string target_str = absl::GetFlag(FLAGS_target);  // 获取服务器地址参数
    cout << "target_str=" << target_str << endl;

    // 创建客户端
    CalcClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));

    int a, b;
    while(cin >> a >> b) {  // 从标准输入读取输入并执行加法操作
        auto sum = client.Add(a, b);
        cout << a << " + " << b << " = " << sum << endl;  // 打印结果
    }

    return 0;
}